core: Make local-clone handle nested refs/heads directories
authorColin Walters <walters@verbum.org>
Sat, 7 Jan 2012 16:26:12 +0000 (11:26 -0500)
committerColin Walters <walters@verbum.org>
Sat, 7 Jan 2012 16:26:12 +0000 (11:26 -0500)
src/ostree/ot-builtin-local-clone.c

index f1a6e1bcdd382110baf38ea902fb4211a812510e..3aad00d0b09aa6fc3f495b15e791a7167c031b27 100644 (file)
@@ -39,10 +39,10 @@ typedef struct {
 } OtLocalCloneData;
 
 static gboolean
-copy_dir_contents (GFile  *src,
-                   GFile  *dest,
-                   GCancellable *cancellable,
-                   GError   **error)
+copy_dir_contents_recurse (GFile  *src,
+                           GFile  *dest,
+                           GCancellable *cancellable,
+                           GError   **error)
 {
   gboolean ret = FALSE;
   GFile *child_src = NULL;
@@ -65,9 +65,20 @@ copy_dir_contents (GFile  *src,
       g_clear_object (&child_dest);
       child_dest = g_file_get_child (dest, name);
 
-      if (!g_file_copy (child_src, child_dest, G_FILE_COPY_OVERWRITE | G_FILE_COPY_NOFOLLOW_SYMLINKS,
-                        cancellable, NULL, NULL, error))
-        goto out;
+      if (g_file_info_get_file_type (file_info) == G_FILE_TYPE_DIRECTORY)
+        {
+          if (!ot_gfile_ensure_directory (child_dest, FALSE, error))
+            goto out;
+          
+          if (!copy_dir_contents_recurse (child_src, child_dest, cancellable, error))
+            goto out;
+        }
+      else
+        {
+          if (!g_file_copy (child_src, child_dest, G_FILE_COPY_OVERWRITE | G_FILE_COPY_NOFOLLOW_SYMLINKS,
+                            cancellable, NULL, NULL, error))
+            goto out;
+        }
       
       g_clear_object (&file_info);
     }
@@ -230,14 +241,14 @@ ostree_builtin_local_clone (int argc, char **argv, GFile *repo_path, GError **er
   
   src_dir = g_file_resolve_relative_path (src_repo_dir, "refs/heads");
   dest_dir = g_file_resolve_relative_path (dest_repo_dir, "refs/heads");
-  if (!copy_dir_contents (src_dir, dest_dir, NULL, error))
+  if (!copy_dir_contents_recurse (src_dir, dest_dir, NULL, error))
     goto out;
   g_clear_object (&src_dir);
   g_clear_object (&dest_dir);
 
   src_dir = g_file_resolve_relative_path (src_repo_dir, "tags");
   dest_dir = g_file_resolve_relative_path (dest_repo_dir, "tags");
-  if (!copy_dir_contents (src_dir, dest_dir, NULL, error))
+  if (!copy_dir_contents_recurse (src_dir, dest_dir, NULL, error))
     goto out;
 
   ret = TRUE;